import { HTTP_REQUEST_URL, HEADER, TOKENNAME, HEADERPARAMS } from '@/config/app';
import { toLogin } from './login';
import { Toast } from './utils.js';
import store from '../store';
/**  
 * 发送网络请求  
 * @param {string} url - 请求的 API 地址  
 * @param {string} method - 请求方法（默认为 'GET'）  
 * @param {Object} data - 请求数据（默认为空对象）  
 * @param {Object} options - 可选参数，包含 noAuth（是否需要授权）和 params（是否使用特殊 header）  
 * @returns {Promise} - 返回 Promise 对象  
 */  
function baseRequest(url, method = 'GET', data = {}, options = {}) {
    const { noAuth = false, params = false } = options;
    let finalHeader = params ? HEADERPARAMS : HEADER;
    const token = wx.getStorageSync('LOGIN_STATUS_TOKEN');
    if (!noAuth) {
        // 添加 token 到 header 中
        finalHeader[TOKENNAME] = token;
    }
    return new Promise((resolve, reject) => {
        uni.request({
            url: `${HTTP_REQUEST_URL}${url}`,
            method: method,
            header: finalHeader,
            data: data,
            success: (res) => {
                if (res.statusCode === 200) {
                    const { code, ...restData } = res.data;
                    if (code === 1) {
                        resolve({ data: restData, response: res });
                    } else if (code === 401) {
                        // 处理 token 无效的情况
                        toLogin();  
                        reject(new Error('Token 无效，请重新登录'));
                    } else {
						Toast(res.data.msg)
                        reject(new Error(res.data.msg));
                    }
                } else {
                    Toast(res.data.msg)
                }
            },
            fail: (err) => {
                // 请求失败时的处理
                reject(new Error( err.message));
            }
        });
    });
}
  
// 创建请求方法对象
const requestMethods = ['options', 'get', 'post', 'put', 'head', 'delete', 'trace', 'connect'];
const request = {};
requestMethods.forEach((method) => {
    request[method.toLowerCase()] = (api, data, options, params) => {
        return baseRequest(api, method, data, options, params);
    };
});

export default request;